#ifndef __MPP_DISPLAY_UTIL_H__
#define __MPP_DISPLAY_UTIL_H__

#include <stdint.h>
#include <stddef.h>
#include <xf86drmMode.h>

/*如果你想了解下面各个参数，请参考RK的libdrm_rockchip的modetest*/
/*DRM没有过多的文档，靠的都是自己撸代码*/
class mpp_disp_util
{
    public:
        typedef  struct
        {
               //uint32_t bpp;   //--实际像素长度
               //uint32_t virtual_height; //--虚拟高度
               uint32_t handles[4];


                //--一下两个关键参数描述了显存格式的排列顺序
                //--很多人有疑问为啥会有这两个参数，本人认为这两个参数就是DRM设计的巧妙之处
                //--因为DRM需要兼容很多像素格式，例如RBGA8888 NV12 NV16，YUV420等等
                //--而这些像素格式在内存中的排列都是不一样的例如RGBA8888因为色彩没有和亮度分离，所以内存排列的顺序是r,g,b,a
                //--RGBA8888的像素格式就是(R+G+B+A)*width*height 这个就是RGBA8888的总长度
                //--而NV12呢？NV12因为亮度和色彩分离，他的亮度为 width*height 因为他色度和亮度是2:0(4个亮度公用两个色度)所以色度的长度为(width*height)/4*2
                //--所以NV12的长度为（width*height）+（(width*height)/4*2） = （width*height）*3/2
                //--从上述情况来看，YUV和RGB的排列是不一样的，那么要怎么描述在内存的排列情况呢？
                //--所以才有以下两个参数
                //--举个栗子：当用户需要的是RGBA8888的排列方式时 offsets[0] = 0 ; pitches[0]=width*4;即可
                //--offsets[0] 表示首行行偏移0  pitches[0]=width*4 表示每行的长度（单位：字节）
                //--当用户需要的是NV12(也是YUV420SP的一种)的排列方式时  
                //--offsets[0] = 0 ; pitches[0]=width;
                //--offsets[1] = width*height ; pitches[1]=width;
                //--offsets[0] = 0 ; pitches[0]=width; 表示亮度起始位置的内存
                //--offsets[1] = width*height ; pitches[1]=width; 表示色度起始位置的内存
               uint32_t  offsets[4];     
               uint32_t  pitches[4];
               
        }depict_shape;   //--描述内存在显示的的排列顺序
        typedef  struct
        {
                void     *map_addr;    //--内存映射
               void      *planes[4];//--需要填充的内存指针的
        }depict_men;
        static uint32_t mpp_format_to_bpp(uint32_t format);
        static uint32_t mpp_format_to_virtual_height(uint32_t format,uint32_t width,uint32_t height);
        static void  mpp_format_depict_sharp(const uint32_t format,
									       const uint32_t width, const uint32_t height,const uint32_t handle,const uint32_t pitch,depict_shape *depict);
        static uint32_t mpp_format_get_pitch(uint32_t format,uint32_t width);       
        static void  mpp_format_depict_sharp(const uint32_t format,
                                                                      const depict_shape *depict,
                                                                      const void *mmap_addr,
                                                                      depict_men * depict_mem);

       static int   mpp_get_supported_format(drmModePlanePtr plane, uint32_t* format);

                                                                                        
};



#endif 
